package com.fxd.service.impl;

import com.fxd.dao.IAccountDao;
import com.fxd.dao.impl.accountDaoImpl;

import com.fxd.service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/**
 * @auther fuxudong
 * @date 2021/1/12 - 16:45
 * <bean id="accountDao" class="com.fxd.dao.impl.accountDaoImpl"
 * scope="" init-method="" destroy-method="">
 * <property name="" value="" ref=""></property>
 * </bean>
 * <p>
 * 1，用于创建对象的
 * @component 作用：用于把当前类对象存入spring容器中
 *      属性：
 *          value：用于指定bean的id，当我们不写时，它的默认值是当前类型，且首字母该小写。
 *          controller：一般用在表现层
 *          service：一般用在业务层
 *          repository：一般用在持久层
 *         以上三个注解他们的作用和属性与component是一模一样
 *         他们三个是spring框架为我们提供明确的三层使用的注解，使我们的三层对象更加清晰
 *
 *2，用于注入数据的
 * @Autowierd
 *         作用：自动按照类型注入，只要容器中有唯一的一个bean对象类型匹配，就可以注入成功。
 *         出现位置：可以变量上，也可以是方法上。
 *         细节：在使用注解注入时，set方法就不是必须的了
 * @qualifier:
 *          作用：在按照类中注入的基础之上再按照名称注入，它在给类成员注入时不能单独使用，但是在给方法参数注入时可以。
 *          属性：
 *              value：用于指定注入bean的id。
 * @resource
 *          作用：直接按照bean的id注入，它可以独立使用
 *          属性：
 *              name：用于指定bean的id
 *以上三个注解只能注入其他bean类型的数据，而基本类型和string类型无法使用该注解实现
 * 另外，集合类型的注入只能通过XML来实现。
 * @value
 *          作用：用于注入基本类型和string类型的数据
 *          属性：
 *              value：用于指定数据的值。它可以使用spring中spel也就是spring中el表达式
 *              el写法:${表达式}
 *3，用于改变作用范围的
 * @scope
 *          作用：用于指定bean的作用范围
 *          属性：
 *              value：指定范围的取值，常用取值：singleton prototype,默认单例。
 *4，和生命周期相关(了解)
 * @predestroy
 *          作用：用于指定销毁方法
 * @postconstruct
 *          作用：用于指定初始化方法
 */
@Service("accountService")
//@Scope("prototype")
public class AccountServiceImpl implements IAccountService {
    //private IAccountDao accountDao = new accountDaoImpl();
//    @Autowired
//    @Qualifier("accountDao1")
    @Resource(name="accountDao2")
    //首先根据类型匹配，如何有多个，则根据变量名称与IOC中id进行匹配。
    private IAccountDao accoutDao;

    public AccountServiceImpl() {
        System.out.println("service对象创建了");
    }

    public void saveAccount() {
        accoutDao.saveAccount();
    }

    @PostConstruct
    public void init() {
        System.out.println("对象初始化了");
    }
    @PreDestroy
    public void destroy() {
        System.out.println("对象销毁了");
    }
}
